package com.keensense.vcm.model;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * @author lanjian
 * @date 2020/5/7 11:09 上午
 */
@XmlRootElement(name = "request")
public class StartIntelligentAnalysisRequest {

    private StartIntelligentAnalysisRequest() {}

    public StartIntelligentAnalysisRequest(String taskName, Integer type) {
        this.taskName = taskName;
        this.type = type;
    }

    /**
     * 任务名称，可以用于任务搜索长度1~128字符
     */
    @XmlElement(name = "task_name")
    private String taskName;

    /**
     * 智能分析任务类型 0: 行为分析(历史行为分析暂不支持) 1: 车牌分析(CPU车牌识别+GPU深度识别(可选)) 2: 人脸分析 3: 摘要分析(只支持历史文件摘要) 4: 以图搜图分析(人体识别) 5：视频索引
     * 7：高级以图搜图(人脸识别+人体识别)(废弃) 8：高级车牌分析(GPU车牌识别+GPU深度识别(可选)) 9：人车混合结构化(人体识别+GPU车辆识别+机非人混合算法)
     */
    @XmlElement
    private Integer type;

    /**
     * 获取摄像机列表系统返回的摄像机编码，与file_id有且只有一个存在
     */
    @XmlElement(name = "camera_id")
    private String cameraId;

    /**
     * 图像信息库发布文件系统返回的文件id，与camera_id有且只有一个存在
     */
    @XmlElement(name = "file_id")
    private String fileId;

    /**
     * 当输入摄像机编码时，生效。 默认为摄像机实况分析 0：实况 1：录像
     */
    @XmlElement(name = "stream_type")
    private Integer streamType;

    /**
     * 录像开始时间戳 当进行摄像机录像任务分析时生效
     */
    @XmlElement(name = "record_starttime")
    private Long recordStartTime;

    /**
     * 录像结束时间戳 当进行摄像机录像任务分析时生效
     */
    @XmlElement(name = "record_endtime")
    private Long recordEndTime;

    /**
     * 是否进行车辆检测 0：否1：是(当type=1时生效)
     */
    @XmlElement(name = "is_vehicle")
    private Integer isVehicle;

    /**
     * 是否进行车辆深度特征识别 0：否1：是(此时会强制做vehicle)(当type=1时生效)如未购买此车辆深度识别GPU lincese，则不能设置该参数
     */
    @XmlElement(name = "is_carlogo")
    private Integer isCarlogo;

    /**
     * 是否进行极速分析，stream_type为录像或file_id不为空时生效，默认为普通分析，0:普通分析1:极速分析（只支持车辆识别、人脸识别、摘要分析，不支持跨域场景）
     */
    @XmlElement(name = "is_amazing_speed")
    private Integer isAmazingSpeed;

    /**
     * 是否开启车辆特征提取模式 0：否 1：是
     */
    @XmlElement(name = "is_plateFeature")
    private Integer isPlateFeature;

    /**
     * 告警级别 默认为1紧急1 :紧急 2：严重 3：一般 4：提示
     */
    @XmlElement(name = "alarm_level")
    private Integer alarmLevel;

    /**
     * 分析起始时间(UTC) ，yyyy-MM-dd，-1表示当前时间
     */
    @XmlElement(name = "start_time")
    private Long startTime;

    /**
     * 分析结束时间(UTC) ，yyyy-MM-dd， -1表示永远不结束
     */
    @XmlElement(name = "end_time")
    private Long endTime;

    /**
     * 感兴趣区域，可以由ocx生成，xml结构，表示区域信息，具体请参见请求示例(暂时只支持车牌相关)
     */
    @XmlElement
    private String roi;

    /**
     * 非感兴趣区域(非检测区域)，同上(系统保留)
     */
    @XmlElement(name = "nroi")
    private String nRoi;

    /**
     * 最小车牌框, 可以由ocx生成，xml结构，表示最小车牌区域信息，具体请参见请求示例(暂时只支持车牌相关)，长度范围[0,255]
     */
    @XmlElement
    private String minCarFrame;

    /**
     * 最大车牌框，可以由ocx生成，xml结构，表示最小大车牌区域信息，具体请参见请求示例(暂时只支持车牌相关), 长度范围[0,255]
     */
    @XmlElement
    private String maxCarFrame;

    /**
     * 卡口模式；0人体卡口 1普通卡口 只有type值为4的才生效
     */
    @XmlElement(name = "hmode")
    private String hMode;

    /**
     * 人脸识别阈值，当前不生效 范围：[0-100]，默认阈值为85
     */
    @XmlElement(name = "recognize-threshold")
    private Integer recognizeThreshold;

    /**
     * 算法列表
     */
    @XmlElementWrapper(name = "algorithms")
    @XmlElement(name = "algorithm")
    private List<String> algorithms;

    /**
     * 该字段只对全网智能的人、车智能相机生效，普通相机即使设置了这个值也不生效。表示对全网智能人、车智能相进行机智能分析使用的媒体流模式。
     * 为空：采用和相机相匹配的默认方式。普通相机默认使用视频流模式，也只能使用视频流模式；全网智能人或车智能相机默认使用图片流模式。 0：图片流模式 1：视频流模式
     */
    @XmlElement
    private Integer analyzeMode;

    /**
     * 该字段只对图片流模式下的全网智能人、车智能相机生效，普通相机即使设置该值也不生效。 为空：采用和分析模式相匹配的默认方式 0：表示VCM系统不存储图片 1：表示VCM系统存储图片
     */
    @XmlElement
    private Integer storeImage;

    /**
     * 执行域类型，不指定执行域则任务执行时默认本域执行 0：上级域 1：本域（默认值） 2：下级域
     */
    @XmlElement
    private Integer domainType;

    /**
     * 执行域编码 当执行域类型为下级域时，则需要输入下级域的执行域编码，用于指定分析任务执行的域。如果不输入域编码，则按照摄像机对应的域编码选择执行域。上传文件的智能分析任务，此字段无效。
     */
    @XmlElement
    private String executeDomainCode;

    /**
     * 数据回传类型，默认回传结构化/特征值/图片 0：不回传 1：回传结构化/特征值/图片URL2：回传结构化/特征值/图片（默认值）
     */
    @XmlElement
    private String dataBackType;

    /**
     * 机非人是否输出人体特征值 0：否 1：是（默认为0，type为9时生效）
     */
    @XmlElement
    private Integer isBodyFeature;

    public void setCameraId(String cameraId) {
        this.cameraId = cameraId;
    }

    public void setFileId(String fileId) {
        this.fileId = fileId;
    }

    public void setStreamType(Integer streamType) {
        this.streamType = streamType;
    }

    public void setRecordStartTime(Long recordStartTime) {
        this.recordStartTime = recordStartTime;
    }

    public void setRecordEndTime(Long recordEndTime) {
        this.recordEndTime = recordEndTime;
    }

    public void setIsVehicle(Integer isVehicle) {
        this.isVehicle = isVehicle;
    }

    public void setIsCarlogo(Integer isCarlogo) {
        this.isCarlogo = isCarlogo;
    }

    public void setIsAmazingSpeed(Integer isAmazingSpeed) {
        this.isAmazingSpeed = isAmazingSpeed;
    }

    public void setIsPlateFeature(Integer isPlateFeature) {
        this.isPlateFeature = isPlateFeature;
    }

    public void setAlarmLevel(Integer alarmLevel) {
        this.alarmLevel = alarmLevel;
    }

    public void setStartTime(Long startTime) {
        this.startTime = startTime;
    }

    public void setEndTime(Long endTime) {
        this.endTime = endTime;
    }

    public void setRoi(String roi) {
        this.roi = roi;
    }

    public void setnRoi(String nRoi) {
        this.nRoi = nRoi;
    }

    public void setMinCarFrame(String minCarFrame) {
        this.minCarFrame = minCarFrame;
    }

    public void setMaxCarFrame(String maxCarFrame) {
        this.maxCarFrame = maxCarFrame;
    }

    public void sethMode(String hMode) {
        this.hMode = hMode;
    }

    public void setRecognizeThreshold(Integer recognizeThreshold) {
        this.recognizeThreshold = recognizeThreshold;
    }

    public void setAlgorithms(List<String> algorithms) {
        this.algorithms = algorithms;
    }

    public void setAnalyzeMode(Integer analyzeMode) {
        this.analyzeMode = analyzeMode;
    }

    public void setStoreImage(Integer storeImage) {
        this.storeImage = storeImage;
    }

    public void setDomainType(Integer domainType) {
        this.domainType = domainType;
    }

    public void setExecuteDomainCode(String executeDomainCode) {
        this.executeDomainCode = executeDomainCode;
    }

    public void setDataBackType(String dataBackType) {
        this.dataBackType = dataBackType;
    }

    public void setIsBodyFeature(Integer isBodyFeature) {
        this.isBodyFeature = isBodyFeature;
    }
}
